/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.actionsystem.gdp.dao;

import br.com.actionsystem.gdp.modelo.Despesa;
import br.com.actionsystem.gdp.modelo.Periodo;
import br.com.actionsystem.gdp.util.Connect;
import br.com.actionsystem.gdp.util.DaoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author USER
 */
public class DespesasDaoImpl implements IntDespesasDao {
    private static final String salvar = "insert into atividade values(?,?,?,?,?,?,?,?)";
    private static final String update = "";
    private static final String delete = "";
    private static final String listAll = "";
    private static final String listByDate = "";

    public void salvar(Despesa despesa) throws DaoException {
        Connection conn = Connect.getConection();
        PreparedStatement psmt = null;
        try {
            psmt = conn.prepareStatement(salvar);
            psmt.setString(1, despesa.getDescricao());
            psmt.setFloat(2, despesa.getValorEstimado());
            psmt.setBoolean(3, false);
            psmt.setBoolean(4, despesa.isTipoPeriodico());
            psmt.setString(5, despesa.getPeriodo().name());
            psmt.setInt(6, despesa.getCategoria().getIdCategoria());
        //    psmt.setDate(7, despesa.getDataVencimento());
            psmt.setInt(8, despesa.getNumParcela());
            psmt.execute();
            conn.commit();
        } catch (SQLException ex) {
            throw new DaoException("Não foi poss�vel salvar esta despesa.", ex);
        } finally {
            Connect.close(conn, psmt);
        }

    }

    public void update(Despesa despesa) throws DaoException {
        Connection conn = Connect.getConection();
        PreparedStatement psmt = null;
        try {
            psmt = conn.prepareStatement(update);
            psmt.setString(1, despesa.getDescricao());
            psmt.setFloat(2, despesa.getValorEstimado());
            psmt.setBoolean(3, false);
            psmt.setBoolean(4, despesa.isTipoPeriodico());
            psmt.setString(5, despesa.getPeriodo().name());
            psmt.setInt(6, despesa.getCategoria().getIdCategoria());
           // psmt.setDate(7, despesa.getDataVencimento());
            psmt.setInt(8, despesa.getNumParcela());
            psmt.setInt(9, despesa.getIdAtividade());
            psmt.execute();
            conn.commit();
        } catch (SQLException ex) {
            throw new DaoException("Não foi poss�vel alterar esta despesa.", ex);
        } finally {
            Connect.close(conn, psmt);
        }
    }

    public void delete(Despesa despesa) throws DaoException {
        Connection conn = Connect.getConection();
        PreparedStatement psmt = null;
        try {
            psmt = conn.prepareStatement(delete);
            psmt.setInt(1, despesa.getNumParcela());
            psmt.execute();
            conn.commit();
        } catch (SQLException ex) {
            throw new DaoException("Nao foi poss�vel deletar esta despesa.", ex);
        } finally {
            Connect.close(conn, psmt);
        }
    }

    public List<Despesa> listAll() {
        Connection conn = Connect.getConection();
        Statement smt = null;
        ResultSet rs = null;
        Despesa despesa = null;
        List<Despesa> lista = new ArrayList<Despesa>();
        try{
        	smt = conn.createStatement();
        	rs = smt.executeQuery(listAll);
        	while(rs.next()){
        		despesa = new Despesa();
        		despesa.setDataVencimento(rs.getDate(""));
        		despesa.setDescricao(rs.getString(""));
        		despesa.setIdAtividade(rs.getInt(""));
        		despesa.setNumParcela(rs.getInt(""));
        		despesa.setPeriodo(Periodo.valueOf(rs.getString("")));        		
        		despesa.setTipoPeriodico(rs.getBoolean(""));
        		despesa.setValorEstimado(rs.getFloat(""));
        		lista.add(despesa);
        	}
        } catch (SQLException ex) {
          ex.printStackTrace();
        } finally {
            Connect.close(conn, smt, rs);
        }
        return lista;
    }

    public List<Despesa> listByDate(Date inicio, Date fim) {
        Connection conn = Connect.getConection();
        PreparedStatement psmt = null;
        ResultSet rs = null;
        Despesa despesa = null;
        List<Despesa> lista = new ArrayList<Despesa>();
        try{
        	psmt = conn.prepareStatement(listByDate);
        	psmt.setDate(1, new java.sql.Date(inicio.getTime()));
        	psmt.setDate(2, new java.sql.Date(fim.getTime()));
        	rs = psmt.executeQuery();
        	while(rs.next()){
        		despesa = new Despesa();
        		despesa.setDataVencimento(rs.getDate(""));
        		despesa.setDescricao(rs.getString(""));
        		despesa.setIdAtividade(rs.getInt(""));
        		despesa.setNumParcela(rs.getInt(""));
        		despesa.setPeriodo(Periodo.valueOf(rs.getString("")));        		
        		despesa.setTipoPeriodico(rs.getBoolean(""));
        		despesa.setValorEstimado(rs.getFloat(""));
        		lista.add(despesa);
        	}
        } catch (SQLException ex) {
          ex.printStackTrace();
        } finally {
            Connect.close(conn, psmt, rs);
        }
        return lista;
    }
}
